package com.iceland.server.server.cmd.strategy;

import com.iceland.common.message.HeaderType;
import com.iceland.server.server.proxy.ProxyServer;
import com.iceland.server.server.proxy.ProxyServerManager;
import com.iceland.common.util.AttributeKeyUtils;
import com.iceland.common.message.CmdMessage;
import com.iceland.common.message.MessageType;
import com.iceland.common.strategy.CmdStrategy;
import com.iceland.server.util.ServerChannelContext;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;

/**
 * 为指定端口创建用于通信的数据交换链接
 */
@Slf4j
public class ProxyChannelConnectStrategy implements CmdStrategy {
    ProxyServerManager proxyServerManager = ProxyServerManager.getSingleInstance();

    @Override
    public void doStrategy(ChannelHandlerContext ctx, CmdMessage m) {
        String[] address = m.getHeader(HeaderType.PROXY_SERVER_ADDRESS).split(":");
        if(address==null || address.length<=1){
            //关闭链接
            log.error("地址为空,拒绝流量转发通道连接");
            ctx.close();
            return;
        }
        String port = address[1];
        if(port==null){
            //关闭链接
            log.error("端口为空,拒绝流量转发通道连接");
            ctx.close();
            return;
        }
        //获取指定的代理服务器
        ProxyServer server = proxyServerManager.getServer(Integer.valueOf(port));
        if(server==null){
            //未找到指定端口服务器
            log.error("未找到指定端口服务器,port:{},拒绝流量转发通道连接",port);
            ctx.close();
            return;
        }
        if(server.isClosing()){
            log.error("服务器已经或正在关闭，不再接收连接，拒绝流量转发通道连接");
            ctx.close();
            return;
        }

        //添加上下文信息
        ServerChannelContext channelContext=new ServerChannelContext(null,null,null,null);
        channelContext.setProxyServer(server);
        AttributeKeyUtils.setChannelContext(ctx.channel(),channelContext);
        //将该ctx加入代理服务器列表
        server.getChannelPool().addAvailableChannel(ctx.channel());

    }

    @Override
    public int getType() {
        return MessageType.DATA_EXAHCNAGE_CHANNEL_CONNECT.getType();
    }
}
